package com.gitee.deament.server.core.cli.db.hash;

import com.gitee.deament.server.config.SystemConfig;
import com.gitee.deament.server.core.annotation.CliHander;
import com.gitee.deament.server.core.cli.AbstractCli;
import com.gitee.deament.server.core.data.ConnectData;
import com.gitee.deament.server.core.data.DBData;
import com.gitee.deament.server.core.data.datatype.Value;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

/**
 * HSET hash field value
 * 可用版本： >= 2.0.0
 * 时间复杂度： O(1)
 * 将哈希表 hash 中域 field 的值设置为 value 。
 *
 * 如果给定的哈希表并不存在， 那么一个新的哈希表将被创建并执行 HSET 操作。
 *
 * 如果域 field 已经存在于哈希表中， 那么它的旧值将被新值 value 覆盖。
 *
 * 返回值
 * 当 HSET 命令在哈希表中新创建 field 域并成功为它设置值时， 命令返回 1 ； 如果域 field 已经存在于哈希表， 并且 HSET 命令成功使用新值覆盖了它的旧值， 那么命令返回 0 。
 * @author deament
 *
 */
@CliHander(command = "HSET")
public class HSETcli extends AbstractCli {
    @Override
    public void executeCli(ChannelHandlerContext channelHandlerContext, String command) {
        DBData dbData = SystemConfig.dbData;
        List<String> values = getValues(command);
        if (values.size() != 4  ) {
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("ERR wrong number of arguments for 'HSET' command"));
        }
        String hash = values.get(1);
        String hashFiled = values.get(2);
        String valuestr = values.get(3);
        int db = ConnectData.SELECT_DB_STORAGE.getUseDB(channelHandlerContext.channel().id().asLongText());
        Value<Map<String, String>> hashData = SystemConfig.dbData.getHashData(db, hash);
        String oldvalue = hashData.getValue().get(hashFiled);
        Value<String> value = new Value<>();
        value.setValue(valuestr);
        dbData.setHashData(db, hash, hashFiled,valuestr);
        if(oldvalue==null){
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("1"));
        }else{
            channelHandlerContext.channel().writeAndFlush(new TextWebSocketFrame("0"));
        }

    }
}
